【Tips】Redshiftでユーザーごとにデフォルトのスキーマを設定し、テーブル名のみでクエリする
どうも!DA部の春田です。
表題の件について、Redshiftのsearch_path
を使用した方法をご紹介します。
問題
オンプレからRedshiftへの移行ケースで、オンプレではDB単位、Redshiftではスキーマ単位でテーブルが分かれている場合、オンプレ環境で使用していたスキーマ名が指定されていないSQLは、Redshiftでそのまま実行することができません。
解決策
この場合、ユーザーごとにデフォルトで参照しに行くスキーマを設定することで、テーブル名のみでもクエリすることができるようになります。具体的には、ALTER USER username SET search_path to schema_name
でユーザーごとに任意のスキーマ名でsearch_path
を設定しておきます。
-- awsuserでログインしてクエリを実行する create schema dwh; create table public.sales (name text); create table dwh.sales (name text); insert into public.sales values('public'); insert into dwh.sales values('dwh'); -- デフォルトではpublicスキーマを参照するようになっている select * from sales; -- -> public -- ALTER USER SETでユーザーごとにsearch_pathを設定する alter user awsuser set search_path to dwh; -- 変更後、salesを参照するとdwhスキーマを見に行くようになる。 select * from sales; -- -> dwh
ALTER USER SET
では、そのユーザーのすべてのセッションに対して、指定したパラメータをデフォルト値として設定できます。search_path
以外にも、例えばenable_result_cache_for_session
をoff
に設定しておけば、クエリ結果でキャッシュを見にいかず、毎回必ずクエリが実行されるようになります。パフォーマンス検証用のユーザーなどに設定しておけば便利ですね。また、wlm_query_slot_count
で任意の数値を設定しておけば、ユーザーごとにWLMのスロット数を決めておくことができます。
詳細は、設定リファレンス - Amazon Redshiftをご参照ください。